//1. void 类型
let v: void;// 声明一个 void 类型的变量. 该变量的值, 只能是 undefined
v = undefined;
// v = null;// X
// v = 100;// X
// v = '200';// X

//下面代码, 表明函数运行的返回值类型为『undefined』
function test():void{
  // return 123; // X
  // return 'love'; // X
  return; //这样写是可以的
}

//2. object 对象类型
let me: object; //声明 me 为 object 类型的变量
let o2: object = {};// 声明并赋值
me = {};
me = [];
me = () => {};
// me = 200; //X

//3. array 数组类型. TS 数组每个元素值的类型都是一样的
let arr: number[] = [1,2,5]; //声明数字类型的数组.
let arr2: Array<string> = ['a','b','c'];
// arr.push('abc');// X
// arr.push(10);
arr[0].toFixed(2);
arr2[0].trim();
// arr2[0].toFixed();// X

//4. 元组 
let t: [number, string, number] = [1, '张三', 28];
// t[0].toFixed();
// t[1].toString();
let xiaolong: [number, string] = [1, '小龙'];
//数组的每一个元素都是一个元组
let stus: [number, string][] = [xiaolong, [2, '小明'], [3, '小刚']]

//5. 枚举类型  defineProperty   enumerable
enum Gender{
  Female = '女',
  Male='男',
  Secret='保密'
}

let xiaohigh: object = {
  name: 'xiaohigh',
  age: 18,
  gender: Gender.Male
}

//6. 联合类型
let u: string | number;
u = 'love';
u = 521;
// u = true;
// Array.prototype.find()  查找满足条件的元素

//7. 类型断言.  肯定的说.
(async () => {
  let v2 : string | number;
  //为 v2 变量赋值
  v2 = await new Promise((resolve) => {
    resolve('iloveyou');
  });
  //调用
  console.log((<string>v2).slice(0, 5));
  //
  console.log((v2 as string).slice(0, 5));
})();

//8. 类型推断
let res = 100; // TS 推断出 res 类型是数字
// res = 'iloveyou'; // X

let res2; // res2 的类型为 any
res2 = 123;
res2 = 'iloveyou';








